/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modlemgooglesvn.modlem_src;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

/**
 *
 * @author xXx
 */
public class KonwersjaBinarna {
        
//        protected static File input = 
//                //"D:\\ZBIORY_DANYCH\\data\\irysy.tab",
//                
//             //  "D:\\ZBIORY_DANYCH\\kddcup_test.txt",
//                   "D:\\ZBIORY_DANYCH\\kddcup_train.txt", 
////    protected static String input = "M:\\kddcup_train.txt",
//            output = "C:\\wynik.bin";
//   static String parametry = "C:\\wynik.bin_parametry_bazy.bin";
//   public static String coRozdzielaDane = ",";
//         public static void main(String[] args) throws IOException {
//         
//         KonwersjaBinarna kb = new KonwersjaBinarna();
//         
//kb.konwersjaBazy(input,output,coRozdzielaDane);
//        // OdczytPlikuBinarnego.OdczytBinarny(output, parametry);
//       
//    }  

//      public String getOutput(){if(output==null){System.out.println("Null output");return "";}
//      
//      return output;
//      }
//         
//      
//      public String getInput(){if(input==null){System.out.println("Null input");return "";}
//      
//      return input;
//      }
//      
//      public void setInput(String input){this.input=input;}
//      public void setOutput(String output){this.output=output;}
      
    
    protected String parametry;
    
    public File getParameters(){
    
        File file = new File(parametry);
        return file;
        
    }
        public  void konwersjaBazy(File input,File output,String znakRozdzielający) throws FileNotFoundException, IOException{
  // ArrayList wystapieniaWartosciAtrybutow = new ArrayList();

         //= new ArrayList<HashMapCounter<String>>();
//                    HashMapLicznik<String> a;
    this.parametry = output.getAbsolutePath()+"_parameters.txt";
    boolean maAtrybuty= false;
   // String decyzja = wyjscie+"_decyzja.bin";
    FileReader fr = new FileReader(input);
    BufferedReader br = new BufferedReader(fr);
    String liniaTekstu = br.readLine();
 //   System.out.print(liniaTekstu + "\n");
    int nr = 0;
    ArrayList<Integer> typyAtrybutow = new ArrayList();
//    if(liniaTekstu==null){
//        System.out.print("DUPA\n");
//    }
    int ileAtrybutow=0;//=Integer.parseInt(st.nextToken(" ")); 
    
    /////////////////////////////////////////////////////////////////////
    //celem jest sprawdzenie czy baza ma na początku dane o typach , ilości atrybutów i ilości rekordów
    if(liniaTekstu.contains("attributes") || liniaTekstu.contains("ATTRIBUTES") 
            || liniaTekstu.contains("Attributes")){ 
        maAtrybuty=true;
    StringTokenizer st = new StringTokenizer(liniaTekstu," ");
    st.nextToken(" ");
    ileAtrybutow=Integer.parseInt(st.nextToken(" ")); 
    FileWriter fw =  new FileWriter(parametry);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.append(liniaTekstu+"\n");
    for(int i =0; i<ileAtrybutow+1;i++){
        
       
       
    liniaTekstu = br.readLine();
    bw.append(liniaTekstu+"\n");
            st = new StringTokenizer(liniaTekstu, " ");
        st.nextToken();
       String linia= st.nextToken();
       //System.out.print(linia + "\n");
       if(linia.equalsIgnoreCase("integer"))typyAtrybutow.add(1);
        else if(linia.equalsIgnoreCase("double"))typyAtrybutow.add(2);
       else if(linia.equalsIgnoreCase("string"))typyAtrybutow.add(3);
       
    }
    bw.close();
    fw.close();
    
   // System.out.println("Byłem tu");
    
    }
    
    ////////////////////////////////////////////////////////////////////////////
    //Jeżeli nie było danych o atrybutach to są one sprawdzane 
    else {
        
                        StringTokenizer st =
                        new StringTokenizer(liniaTekstu, znakRozdzielający);
                
                while (st.hasMoreTokens()) {
                    String tok = st.nextToken();
                    try {
                        Integer.parseInt(tok);
                        typyAtrybutow.add(1);
                    } catch (NumberFormatException e) {
                        try {
                            Double.parseDouble(tok);
                            typyAtrybutow.add(2);
                        } catch (NumberFormatException f) {
                            typyAtrybutow.add(3);
                            ;
                        }
                  }



                }
                FileWriter fw = new FileWriter(parametry);
                fw.append(typyAtrybutow.size() + "\n");
                for (int i = 0; i < typyAtrybutow.size(); i++) {

                    fw.append(typyAtrybutow.get(i) + "\n");
                    
                }

                fw.flush();
                fw.close();
               
                System.gc();
    
        
    
    }
    
//    else nr =1;
        //Odpowiada za sprawdzanie decyzji
    
         DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(output)));
//        RandomAccessFile rafdec = new RandomAccessFile(wyjscie+"decyzja.bin", "rw");
//        FileDescriptor fddec = rafdec.getFD();
//        DataOutputStream dosdec = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fddec)));
   
   int iterator=0;
    int adresRekordu=0;
    while ((liniaTekstu = br.readLine())!=null){
        
    StringTokenizer st = new StringTokenizer(liniaTekstu,znakRozdzielający);
    int j = 0;
//    adresRekordu = dos.size();
          while (st.hasMoreTokens()) {
                

                
                String tok = st.nextToken();
                //System.out.println(tok);
                try {
                    if (!tok.equals(" ")) {
                        int calkowita = Integer.parseInt(tok);
                        dos.writeInt(calkowita);
//                        try{
//                              
//                    licznik.get(j).umiescWartosc(tok);
//                    }catch(IndexOutOfBoundsException ex){
//                    a = new HashMapLicznik<String>();                
//                    licznik.add(a);
//                    licznik.get(j).umiescWartosc(tok);
//                    }
                        
//                if(j==typyAtrybutow.size()-1){
//                            dosdec.writeInt(adresRekordu);
//                            dosdec.writeInt(calkowita);}
                        
                    }
                } catch (NumberFormatException e) {

                    try {
                        double zmiennoprzecinkowa = Double.parseDouble(tok);
                        dos.writeDouble(zmiennoprzecinkowa);
//                        try{
//                              
//                    licznik.get(j).umiescWartosc(tok);
//                    }catch(IndexOutOfBoundsException ex){
//                    a = new HashMapLicznik<String>();                
//                    licznik.add(a);
//                    licznik.get(j).umiescWartosc(tok);
//                    }
//                         if(j==typyAtrybutow.size()-1){
//                            dosdec.writeInt(adresRekordu);
//                            dosdec.writeDouble(zmiennoprzecinkowa);}
                    } catch (NumberFormatException f) {

//                        if(j==typyAtrybutow.size()-1){
//                            dosdec.writeInt(adresRekordu);
//                            dosdec.writeUTF(tok);}

                        dos.writeUTF(tok);
                        
//                        try{
//                              
//                    licznik.get(j).umiescWartosc(tok);
//                    }catch(IndexOutOfBoundsException ex){
//                    a = new HashMapLicznik<String>();                
//                    licznik.add(a);
//                    licznik.get(j).umiescWartosc(tok);
//                    }
                    }
                }
j++;
                if(j>=typyAtrybutow.size())
                {j=0;
                }
                
            }



        
        iterator++;
    
    }
        
    if(maAtrybuty==false){
     FileWriter fw = new FileWriter(parametry, true);
        fw.append(iterator + "");

        

        fw.flush();
        fw.close();
    }
    dos.close();
//    dosdec.close();
//    FileWriter fww = new FileWriter("C:\\klucze.txt");
//    BufferedWriter bww = new BufferedWriter(fww);
//    System.out.println(typyAtrybutow.size()+"\n");
//    System.out.println(licznik.size()+"\n");
//    ArrayList<String> najlepszyPodzial = new ArrayList<String>();
//    for(int i = 0;i<licznik.size();i++){
//    //bww.append(licznik.get(i).zwrocKlucze()+"\n\n\n\n\n\n\n");
//  Set<String> set = licznik.get(i).zwrocKlucze();
//   Object[] o = set.toArray();
//   
//  ArrayList<String> l= new ArrayList<String>();
//  int iloscWartosci = iterator;
//  int ileKluczy = o.length;
//     for(int k = 0;k<ileKluczy;k++){
//   l.add((String)o[k]); 
//   }
//  int g=0;
//
//   
//   
//   Collections.sort(l);
//System.out.println("Atrybut "+(i+1));
//int p=0;
//   for(int j=0;j<ileKluczy;j++){
//      
//    g = g+  licznik.get(i).odbierzWartosc(l.get(j));
//    if(g>=(iloscWartosci/2)){
//        int g1 = (iloscWartosci/2)-g;
//        int g2 = (iloscWartosci/2)-g-licznik.get(i).odbierzWartosc(l.get(j-1));
//       
//        if(g1<0)g1=-g1;
//        if(g2<0)g2=-g2;
//        if(g1==iloscWartosci/2){ 
//            
//            najlepszyPodzial.add(">= "+l.get(j));
//        
//        break;
//        }else if (g2 == iloscWartosci/2){
//        najlepszyPodzial.add("< "+l.get(j-1));
//        g=g-licznik.get(i).odbierzWartosc(l.get(j-1));
//        break;
//        } else if(g1<g2){
//    
//        //g=g-licznik.get(i).odbierzWartosc(l.get(j));
//    najlepszyPodzial.add("< "+l.get(j));
//  p=j;
//    break;
//    }
//    else{
//            g=g-licznik.get(i).odbierzWartosc(l.get(j-1));
//    najlepszyPodzial.add(">= "+l.get(j));
//        
//     p=j;
//        break;
//    }
//        
//    }
// // System.out.println(l.get(j) + " " + licznik.get(i).odbierzWartosc(l.get(j)));
//   
//   }
//   //System.out.println(najlepszyPodzial.get(i)+" "+(g-licznik.get(i).odbierzWartosc(l.get(p))));
//   System.out.println(najlepszyPodzial.get(i)+" "+g);
//    }
//    
//    bww.close();
//    fww.close();
    
//        for(int i =0; i<typyAtrybutow.size();i++)
//    System.out.println("\n"+typyAtrybutow.get(i));

}
  

    
  
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  
    
    
